package service

import (
	"go-file-perception-model/internal/config"
)

// EnhancedTextChunker 增强的文本分块器
// 解决句子完整性和语义连贯性问题
type EnhancedTextChunker struct {
	embeddingModel   EmbeddingModel
	chunkProcessor   *ChunkProcessor
	chunkOptimizer   *ChunkOptimizer
	chunkValidator   *ChunkValidator
	config          *config.FileIndexConfig
}

// NewEnhancedTextChunker 创建增强文本分块器
func NewEnhancedTextChunker(embeddingModel EmbeddingModel, cfg *config.FileIndexConfig) *EnhancedTextChunker {
	return &EnhancedTextChunker{
		embeddingModel:   embeddingModel,
		chunkProcessor:   NewChunkProcessor(embeddingModel, cfg),
		chunkOptimizer:   NewChunkOptimizer(embeddingModel, cfg),
		chunkValidator:   NewChunkValidator(cfg),
		config:          cfg,
	}
}

// ChunkText 智能文本分块
// 优化1：避免切断完整句子
// 优化2：基于语义相似度优化分块边界
func (c *EnhancedTextChunker) ChunkText(text string) ([]string, error) {
	if c.config.SemanticChunking {
		return c.semanticChunkWithSentenceBoundary(text)
	}
	return c.fixedSizeChunkWithSentenceBoundary(text)
}

// semanticChunkWithSentenceBoundary 基于语义的句子边界分块
func (c *EnhancedTextChunker) semanticChunkWithSentenceBoundary(text string) ([]string, error) {
	// 1. 使用分块处理器进行语义分块
	chunks, err := c.chunkProcessor.ProcessSemanticChunking(text)
	if err != nil {
		return nil, err
	}
	
	// 2. 使用优化器进行分块优化
	optimizedChunks := c.chunkOptimizer.OptimizeChunkSizes(chunks)
	
	// 3. 最终验证：确保所有小于100字符的分块都被强制合并
	finalChunks := c.chunkValidator.FinalChunkValidation(optimizedChunks)
	
	return finalChunks, nil
}

// fixedSizeChunkWithSentenceBoundary 固定大小分块但保持句子完整性
func (c *EnhancedTextChunker) fixedSizeChunkWithSentenceBoundary(text string) ([]string, error) {
	// 1. 使用分块处理器进行固定大小分块
	chunks, err := c.chunkProcessor.ProcessFixedSizeChunking(text)
	if err != nil {
		return nil, err
	}
	
	// 2. 最终验证：确保所有小于100字符的分块都被强制合并
	finalChunks := c.chunkValidator.FinalChunkValidation(chunks)
	
	return finalChunks, nil
}